/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package gace.dao;

import gace.logica.Cliente;
import java.sql.Connection;
import java.sql.PreparedStatement;
import gace.basededatos.Conexion;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;

/**
 *
 * @author german
 */
public class ClienteDao {

    Connection conexion;

    public ClienteDao() throws SQLException{
        this.conexion =  Conexion.getConexion();
    }

    /**
     *
     * @param idCliente --
     * @return Retorna true si el cliente es huesped, si no retorna false.
     */
    public boolean esHuesped(int idCliente) throws SQLException{
        String sql = "select * from cliente where idcliente = ? and huesped = TRUE";
        PreparedStatement stmt = conexion.prepareStatement(sql);
        stmt.setInt(1, idCliente);
        ResultSet rs = stmt.executeQuery();
        int numReg = rs.getFetchSize();
        if (numReg == 1)
            return true;
        else
            return false;
    }

    /*
     * Agrega cliente a la bd.
     * @param c1 Objeto de tipo Cliente que representa un registro en la tabla
     * Cliente de la bd.
     */
    public void crearCliente(Cliente c1) throws SQLException{

        String sqlCliente = "insert into cliente (nombre, apellidos, direccion, telefono, huesped)"
                + "values (?, ?, ?, ?, ?)";


        String autogenColumns[] = {"idreserva"};
        PreparedStatement stmt = conexion.prepareStatement(sqlCliente,autogenColumns);
        stmt.setString(1, c1.getNombre());
        stmt.setString(2, c1.getApellido());
        stmt.setString(3, c1.getDireccion());
        stmt.setString(4, c1.getTel());
        stmt.setBoolean(5, c1.isEsHuesped());

              

        stmt.executeUpdate();

        // codigo para obtener el ultimo valor de la(s) llave(s)
        //

        int autoIncKeyFromFunc = -1;
        ResultSet rs = stmt.executeQuery("SELECT LAST_INSERT_ID()");

        if (rs.next()) {
            autoIncKeyFromFunc = rs.getInt(1);
        } else {
            // throw an exception from here
        }

        rs.close();
        c1.setId(autoIncKeyFromFunc);
        System.out.println("Key returned from " +
                       "'SELECT LAST_INSERT_ID()': " +
                       autoIncKeyFromFunc);

        stmt.close();
        
       
    }

    /**
     * Elimina un cliente de la bd.
     * @param c1 Objeto de tipo Cliente que representa un registro en la tabla
     * Cliente de la bd.
     */
    public void eliminarCliente(Cliente c1) throws SQLException{
        String sql = "delete from cliente where idcliente = ?";
        PreparedStatement stmt = conexion.prepareStatement(sql);
        stmt.setInt(1, c1.getId());
        stmt.execute();
        stmt.close();
    }

    /**
     *
     * @return Los clientes que existen en la base de datos.
     */
    public ArrayList<Cliente> listarClientes() throws SQLException{
        String sql = "select * from cliente";
        PreparedStatement stmt = conexion.prepareStatement(sql);
        ResultSet rs = stmt.executeQuery();
        ArrayList<Cliente> clientes = new ArrayList<Cliente>();
        while(rs.next()){
            Cliente c1 = new Cliente();
            c1.setId(rs.getInt("idcliente"));
            c1.setNombre(rs.getString("nombre"));
            c1.setApellido(rs.getString("apellidos"));
            c1.setDireccion(rs.getString("direccion"));
            c1.setTel(rs.getString("telefono"));
            c1.setEsHuesped(rs.getBoolean("huesped"));
            clientes.add(c1);
     
        }
        rs.close();
        stmt.close();

        return clientes;

    }
    
     /**
     * Obtiene de la base de datos la lista de contactos con el nombre buscado.
     * @return Una lista con los contactos que hay en la base de datos.
     * @throws SQLException
     */

      public ArrayList<Cliente> getLista(String name) throws SQLException{
        String sql = "select * from cliente where nombre like ?";
        PreparedStatement stmt = this.conexion.prepareStatement(sql);
        stmt.setString(1, name);
        ResultSet rs = stmt.executeQuery();
        ArrayList<Cliente> clientes = new ArrayList<Cliente>();
        

        while(rs.next()){
             Cliente c1 = new Cliente();
            c1.setId(rs.getInt("idcliente"));
            c1.setNombre(rs.getString("nombre"));
            c1.setApellido(rs.getString("apellidos"));
            c1.setDireccion(rs.getString("direccion"));
            c1.setTel(rs.getString("telefono"));
            c1.setEsHuesped(rs.getBoolean("huesped"));
            clientes.add(c1);
        }

        rs.close();
        stmt.close();

        return clientes;

    }

     /**
     * Modifica un cliente que se encuentre en la base de datos.
     * @param c1 El cliente a modificar.
     * @throws SQLException
     */
    public void modificar(Cliente c1) throws SQLException{
        // Ser prepara la sentencia sql
        String sql = "update cliente set nombre=?, apellidos=?, direccion=?, telefono=?, huesped=? "
                + "where idcliente=?";
        PreparedStatement stmt = conexion.prepareStatement(sql);
        stmt.setString(1, c1.getNombre());
        stmt.setString(2, c1.getApellido());
        stmt.setString(3, c1.getDireccion());
        stmt.setString(4, c1.getTel());
        stmt.setBoolean(5, c1.isEsHuesped());
        stmt.setInt(6, c1.getId());

        // se ejecuta la sentencia sql definida previamente
        stmt.execute();
        stmt.close();
    }



      public static void main(String args[]) throws SQLException{

        // Prueba crear cliente funciona
       Cliente r = new Cliente();
      r.setNombre("Eliot");
      r.setApellido("Yañez");
      r.setDireccion("3 Oriente Nº 29");
      r.setTel("2764740996");
      r.setEsHuesped(true);
      ClienteDao cDAO = new ClienteDao();
        cDAO.crearCliente(r);

          // Prueba ELIMINAR CLIENTE funciona
        /* Cliente r1 = new Cliente();
         r1.setId(2);
         r1.setNombre("Eliot");
      r1.setApellido("Yañez");
      r1.setDireccion("3 Oriente Nº 29");
      r1.setTel("2764740996");
      r1.setEsHuesped(true);
      r1.setRenta_idrenta(1);
      r1.setReserva_idreserva(1);
      r1.setReserva_renta_idrenta(1);
       ClienteDao c1DAO = new ClienteDao();
      c1DAO.eliminarCliente(r1);*/
        // Prueba cancelar reserva
        
        // Prueba modificar CLIENTE funciona
      /*  Cliente r1 = new Cliente();
         r1.setId(3);
         r1.setNombre("Chango");
      r1.setApellido("Leon");
      r1.setDireccion("Quien Sabe Donde");
      r1.setTel("7647409962");
      r1.setEsHuesped(false);
       ClienteDao c1DAO = new ClienteDao();
      c1DAO.modificar(r1);*/
        // Prueba cancelar reserva
    }

}
